package com.mango.leet.code.easy;

/**
 * 100. 相同的树
 */
/**
 * 给你两棵二叉树的根节点 p 和 q ，编写一个函数来检验这两棵树是否相同。
 *
 * 如果两个树在结构上相同，并且节点具有相同的值，则认为它们是相同的。
 *
 *  
 *
 * 示例 1：
 *
 *
 * 输入：p = [1,2,3], q = [1,2,3]
 * 输出：true
 * 示例 2：
 *
 *
 * 输入：p = [1,2], q = [1,null,2]
 * 输出：false
 * 示例 3：
 *
 *
 * 输入：p = [1,2,1], q = [1,1,2]
 * 输出：false
 *  
 *
 * 提示：
 *
 * 两棵树上的节点数目都在范围 [0, 100] 内
 * -104 <= Node.val <= 104
 *
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/same-tree
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */

/**
 * @Author: mango
 * @Date: 2022/4/8 10:05 下午
 */
public class LC100_SameTree {
    /**
     * Definition for a binary tree node.
     */
    public class TreeNode {
          int val;
          TreeNode left;
          TreeNode right;
          TreeNode() {}
          TreeNode(int val) { this.val = val; }
          TreeNode(int val, TreeNode left, TreeNode right) {
              this.val = val;
              this.left = left;
              this.right = right;
          }
      }

    class Solution {
        public boolean isSameTree(TreeNode p, TreeNode q) {
            return process(p,q);
        }
        // 递归判断
        private boolean process(TreeNode p, TreeNode q) {
            // p空q不空，返回false
            if(p == null && q != null){
                return false;
            }
            // q空p不空，返回false
            if(p != null && q == null){
                return false;
            }
            if(p != null && q != null ){
                // 都不空，但值不相等返回false
                if(p.val != q.val) {
                    return false;
                }else{
                    // 递归比较左树
                    boolean left = process(p.left,q.left);
                    // 如果左树相等，继续递归比较右树
                    if(left){
                        // 返回右树比较结果
                        return process(p.right,q.right);
                    }else{
                        // 如果左树不相等，则返回false
                        return false;
                    }
                }
            }
            // 其他情况均返回true
            return true;
        }
    }
}
